ace.define(
  'ace/mode/tex_highlight_rules',
  ['require', 'exports', 'module', 'ace/lib/oop', 'ace/lib/lang', 'ace/mode/text_highlight_rules'],
  function (require, exports, module) {
    /*
     * tex_highlight_rules.js
     *
     * Copyright (C) 2009-11 by RStudio, Inc.
     *
     * The Initial Developer of the Original Code is
     * Ajax.org B.V.
     * Portions created by the Initial Developer are Copyright (C) 2010
     * the Initial Developer. All Rights Reserved.
     *
     * Distributed under the BSD license:
     *
     * Copyright (c) 2010, Ajax.org B.V.
     * All rights reserved.
     *
     * Redistribution and use in source and binary forms, with or without
     * modification, are permitted provided that the following conditions are met:
     *     * Redistributions of source code must retain the above copyright
     *       notice, this list of conditions and the following disclaimer.
     *     * Redistributions in binary form must reproduce the above copyright
     *       notice, this list of conditions and the following disclaimer in the
     *       documentation and/or other materials provided with the distribution.
     *     * Neither the name of Ajax.org B.V. nor the
     *       names of its contributors may be used to endorse or promote products
     *       derived from this software without specific prior written permission.
     *
     * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
     * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
     * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
     * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY
     * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
     * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
     * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
     * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
     *
     */
    'use strict';
    var oop = require('../lib/oop');
    var lang = require('../lib/lang');
    var TextHighlightRules = require('./text_highlight_rules').TextHighlightRules;
    var TexHighlightRules = function (textClass) {
      if (!textClass) textClass = 'text';
      this.$rules = {
        start: [
          {
            token: 'comment',
            regex: '%.*$',
          },
          {
            token: textClass,
            regex: '\\\\[$&%#\\{\\}]',
          },
          {
            token: 'keyword',
            regex:
              '\\\\(?:documentclass|usepackage|newcounter|setcounter|addtocounter|value|arabic|stepcounter|newenvironment|renewenvironment|ref|vref|eqref|pageref|label|cite[a-zA-Z]*|tag|begin|end|bibitem)\\b',
            next: 'nospell',
          },
          {
            token: 'keyword',
            regex: '\\\\(?:[a-zA-Z0-9]+|[^a-zA-Z0-9])',
          },
          {
            token: 'paren.keyword.operator',
            regex: '[[({]',
          },
          {
            token: 'paren.keyword.operator',
            regex: '[\\])}]',
          },
          {
            token: textClass,
            regex: '\\s+',
          },
        ],
        nospell: [
          {
            token: 'comment',
            regex: '%.*$',
            next: 'start',
          },
          {
            token: 'nospell.' + textClass,
            regex: '\\\\[$&%#\\{\\}]',
          },
          {
            token: 'keyword',
            regex:
              '\\\\(?:documentclass|usepackage|newcounter|setcounter|addtocounter|value|arabic|stepcounter|newenvironment|renewenvironment|ref|vref|eqref|pageref|label|cite[a-zA-Z]*|tag|begin|end|bibitem)\\b',
          },
          {
            token: 'keyword',
            regex: '\\\\(?:[a-zA-Z0-9]+|[^a-zA-Z0-9])',
            next: 'start',
          },
          {
            token: 'paren.keyword.operator',
            regex: '[[({]',
          },
          {
            token: 'paren.keyword.operator',
            regex: '[\\])]',
          },
          {
            token: 'paren.keyword.operator',
            regex: '}',
            next: 'start',
          },
          {
            token: 'nospell.' + textClass,
            regex: '\\s+',
          },
          {
            token: 'nospell.' + textClass,
            regex: '\\w+',
          },
        ],
      };
    };
    oop.inherits(TexHighlightRules, TextHighlightRules);
    exports.TexHighlightRules = TexHighlightRules;
  },
);

ace.define(
  'ace/mode/matching_brace_outdent',
  ['require', 'exports', 'module', 'ace/range'],
  function (require, exports, module) {
    'use strict';
    var Range = require('../range').Range;
    var MatchingBraceOutdent = function () {};
    (function () {
      this.checkOutdent = function (line, input) {
        if (!/^\s+$/.test(line)) return false;
        return /^\s*\}/.test(input);
      };
      this.autoOutdent = function (doc, row) {
        var line = doc.getLine(row);
        var match = line.match(/^(\s*\})/);
        if (!match) return 0;
        var column = match[1].length;
        var openBracePos = doc.findMatchingBracket({ row: row, column: column });
        if (!openBracePos || openBracePos.row == row) return 0;
        var indent = this.$getIndent(doc.getLine(openBracePos.row));
        doc.replace(new Range(row, 0, row, column - 1), indent);
      };
      this.$getIndent = function (line) {
        return line.match(/^\s*/)[0];
      };
    }.call(MatchingBraceOutdent.prototype));
    exports.MatchingBraceOutdent = MatchingBraceOutdent;
  },
);

ace.define(
  'ace/mode/tex',
  [
    'require',
    'exports',
    'module',
    'ace/lib/oop',
    'ace/mode/text',
    'ace/mode/text_highlight_rules',
    'ace/mode/tex_highlight_rules',
    'ace/mode/matching_brace_outdent',
  ],
  function (require, exports, module) {
    /*
     * tex.js
     *
     * Copyright (C) 2009-11 by RStudio, Inc.
     *
     * The Initial Developer of the Original Code is
     * Ajax.org B.V.
     * Portions created by the Initial Developer are Copyright (C) 2010
     * the Initial Developer. All Rights Reserved.
     *
     * Distributed under the BSD license:
     *
     * Copyright (c) 2010, Ajax.org B.V.
     * All rights reserved.
     *
     * Redistribution and use in source and binary forms, with or without
     * modification, are permitted provided that the following conditions are met:
     *     * Redistributions of source code must retain the above copyright
     *       notice, this list of conditions and the following disclaimer.
     *     * Redistributions in binary form must reproduce the above copyright
     *       notice, this list of conditions and the following disclaimer in the
     *       documentation and/or other materials provided with the distribution.
     *     * Neither the name of Ajax.org B.V. nor the
     *       names of its contributors may be used to endorse or promote products
     *       derived from this software without specific prior written permission.
     *
     * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
     * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
     * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
     * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY
     * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
     * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
     * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
     * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
     *
     */
    'use strict';
    var oop = require('../lib/oop');
    var TextMode = require('./text').Mode;
    var TextHighlightRules = require('./text_highlight_rules').TextHighlightRules;
    var TexHighlightRules = require('./tex_highlight_rules').TexHighlightRules;
    var MatchingBraceOutdent = require('./matching_brace_outdent').MatchingBraceOutdent;
    var Mode = function (suppressHighlighting) {
      if (suppressHighlighting) this.HighlightRules = TextHighlightRules;
      else this.HighlightRules = TexHighlightRules;
      this.$outdent = new MatchingBraceOutdent();
      this.$behaviour = this.$defaultBehaviour;
    };
    oop.inherits(Mode, TextMode);
    (function () {
      this.lineCommentStart = '%';
      this.getNextLineIndent = function (state, line, tab) {
        return this.$getIndent(line);
      };
      this.allowAutoInsert = function () {
        return false;
      };
      this.$id = 'ace/mode/tex';
      this.snippetFileId = 'ace/snippets/tex';
    }.call(Mode.prototype));
    exports.Mode = Mode;
  },
);
(function () {
  ace.require(['ace/mode/tex'], function (m) {
    if (typeof module == 'object' && typeof exports == 'object' && module) {
      module.exports = m;
    }
  });
})();
